package com.crm.system.service.returnMoney;

import com.crm.common.model.DhPageInfo;
import com.crm.model.entity.returnMoney.BankFlow;
import com.crm.model.qo.customerManager.CustomerPayQO;
import com.crm.model.qo.returnMoney.BankFlowQO;
import com.crm.model.qo.returnMoney.BankFlowRelateQO;
import com.crm.model.qo.returnMoney.BankFlowRelieveQO;
import com.crm.model.vo.returnMoney.*;

import java.math.BigDecimal;
import javax.servlet.ServletOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.List;
import java.util.Map;

/**
 * 银行流水
 *
 * @author yuanyunfeng
 * @date 2021/7/26 10:03
 */
public interface BankFlowService {


    /**
     * 导入银行模板的数据入数据库
     *
     * @param bankList
     * @return
     * @throws ParseException
     */
    BankImportVO importBankData(List<BankImportModel> bankList) throws ParseException;


    /**
     * 根据订单id查询 订单基本详情、产品信息
     *
     * @param productOrderId
     * @param pageIndex
     * @param pageSize
     * @return
     */
    AssociatedOrderVO queryByOrderNumber(String productOrderId, Integer pageIndex, Integer pageSize);


    /**
     * 流水关联
     *
     * @param relateQO
     * @return
     * @throws ParseException
     */
    Map<String, String> relatedOrder(BankFlowRelateQO relateQO) throws ParseException;


    /**
     * 获取上传进度条
     *
     * @return
     */
    BankProcessEntity queryUploadProcess();


    /**
     * 取消上传接口
     *
     * @param readRow
     * @return
     */
    String cancelUpload(String readRow) throws InterruptedException;


    /**
     * 分页查询
     *
     * @param pageIndex
     * @param pageSize
     * @param sortName
     * @param sortOrder
     * @param bankFlowQO 查询条件
     * @return
     */
    DhPageInfo<BankFlowQueryVO> queryBankFlowData(Integer pageIndex, Integer pageSize, String sortName, String sortOrder, BankFlowQO bankFlowQO);


    /**
     * 页面查询总金额
     *
     * @return
     * @param queryYear 年
     * @param queryMonth 月
     */
    BankFlowDataVO queryMonthMonthTotal(String queryYear, String queryMonth);


    /**
     * 当前流水关联明细
     *
     * @param pageIndex
     * @param pageSize
     * @param flowId
     * @return
     */
    DhPageInfo<BankFlowRelateVO> queryBankRelatedByFlowId(Integer pageIndex, Integer pageSize, String flowId);


    /**
     * 当前流水关联的订单所相关的回款操作记录
     *
     * @param pageIndex
     * @param pageSize
     * @param flowId
     * @param orderNumber
     * @param payNumber
     * @return
     */
    DhPageInfo<BankFlowReturnLogVO> queryOperatorLog(Integer pageIndex, Integer pageSize, String flowId, String orderNumber, String payNumber);


    /**
     * 根据订单编号查询 当前订单所关联的流水信息、回款记录
     *
     * @param pageIndex
     * @param pageSize
     * @param flowId
     * @param orderNumber
     * @param payNumber
     * @return
     */
    DhPageInfo<BankOrderReturn> queryReturnMoney(Integer pageIndex, Integer pageSize, String flowId, String orderNumber, String payNumber);

    /**
     * 解除关联
     *
     * @param relieveQO
     * @return
     */
    String relieveBank(BankFlowRelieveQO relieveQO);

    /**
     * 根据订单编号查询订单id
     *
     * @param orderNumber
     * @return
     */
    String queryOrderId(String orderNumber);

    /**
     * @return com.crm.model.entity.returnMoney.BankFlow
     * @author yuanyunfeng
     * @Description 根据流水id查流水基本信息
     * @date 2021/11/9 9:41
     * @Param [flowId]
     **/
    BankFlowQueryVO selectByFlowId(String flowId);

    /*
     * @author  yuanyunfeng
     * @Description 删除流水记录
     * @date  2021/11/17 17:19
     * @Param [flowId]
     * @return String
     **/
    String deleteByFlowId(String flowId);



    /**
     * @author  yuanyunfeng
     * @Description 新增流水记录
     * @date  2021/11/19 13:44
     * @Param [bankReq]
     * @return String
     **/
    String insertBankFlow(BankImportModel bankReq);

    /**
     * 通过订单编号的公司，流水号查询流水可用余额
     * @param serial
     * @param companyId
     * @return
     */
    BigDecimal selectCountAvailableAmount(String serial, String companyId);

    /**
     * 根据流水号查询流水信息
     * @param serial
     * @return
     */
    List<BankFlow> selectByTransactionNo(String serial,String orderId);

    /**
     * 导出流水
     * @Param sortName
     * @Param sortOrder
     * @Param bankFlowQO
     * @Param outputStream
     * @Author xielinqi
     * @Date 11:03 上午 2021/11/30
     */
    boolean exportBankFlowData(String sortName, String sortOrder, BankFlowQO bankFlowQO, ServletOutputStream outputStream) throws IOException;



    /**
     * @author  yuanyunfeng
     * @Description 调减流水
     * @date  2021/12/1 10:30
     * @Param [flowId, modifyMoney, modifyReson]
     * @return void
     **/
    String subAvailableAmount(String flowId, BigDecimal modifyMoney, String modifyReason);
}
